package wc;

import java.io.*;

/**
 * Author: wuhen
 * Date: 2018/10/13
 * Time: 15:53
 */
public class ComInfo {
    public static Wc comInfo(String fileName) {
        int comFlag = 0;  //每遇到一个“/*”则+1，每遇到一个“*/”则减一；为正说明正处于多行注释之中
        String regCom = "(\\s*)(\\{|\\})?(\\s*)(//)([\\s\\S]*)";     //单行注释行
        String regCom2 = "(\\s*)(\\{|\\})?(\\s*)(/\\*)([\\s\\S]*)";  //可能是多行注释起始行的正则表达式
        String regEmp = "(\\s*)(\\{|\\}|;)?(\\s*)";            //空行的正则表达式
        Wc wc = new Wc();
        //说明：MayStartCommons为true，则说明当前行出现了/*
        try {
            // 防止文件建立或读取失败，用catch捕捉错误并打印，也可以throw
            File filename = new File(fileName); // 要读取该路径的文件
            InputStreamReader reader = new InputStreamReader(
                    new FileInputStream(filename)); // 建立一个输入流对象reader
            BufferedReader br = new BufferedReader(reader); // 建立一个对象，它把文件内容转成计算机能读懂的语言
            String line;
            line = br.readLine();
            while (line != null) {

                //__________________判断本行类型：代码行、空行、注释行_____________________

                if (comFlag <= 0)  //如果目前不在多行注释当中
                {
                    if (line.matches(regCom))  //判断是不是单行注释行
                        wc.comLines++;
                    else if (line.matches(regCom2))  //判断是否可能是多行注释的起始行
                    {

                        //下面判断是不是多行注释的开始
                        //统计“/*”和“*/”的个数相应的改变comFlag的值
                        String s = line;
                        int i = 0;
                        while (i < s.length()) {
                            if (s.indexOf("/*", i) == i) {
                                comFlag++;

                                i += 2;
                            } else if (s.indexOf("*/", i) == i) {
                                comFlag--;
                                i += 2;
                            } else i++;

                        }
                        if (comFlag == 0 && !(s.substring(s.lastIndexOf("*/") + 2)).matches(regEmp)) {
                            wc.codeLines++;

                        } else wc.comLines++;

                    } else if (line.matches(regEmp)) {
                        //isEmpLine=true;
                        wc.empLines++;
                    } else {
                        //isCodLine=true;
                        wc.codeLines++;

                    }
                } else  //如果当前正在多行注释当中
                {
                    //判断是否含有该多行注释结束的“*/”;

                    //统计“/*”和“*/”的个数相应的改变comFlag的值
                    //int countLeft=0,countRight=0;
                    String s = line;
                    int i = 0;
                    i = 0;
                    while (i < s.length()) {
                        if (s.indexOf("/*", i) == i) {
                            comFlag++;
                            i += 2;
                        } else if (s.indexOf("*/", i) == i) {
                            comFlag--;
                            i += 2;
                        } else i++;

                    }

                    if (comFlag <= 0) //如果出现了多行注释结束的 “*/”
                    {
                        String sub = line.substring(line.lastIndexOf("*/") + 2);

                        if (sub.matches(regEmp)) //如果*/后面的子串，符合空行特征，则改整行为注释行
                        {
                            wc.comLines++;
                        } else {
                            wc.codeLines++;
                        }
                    } else //不是多行注释的结束，则一定为注释行
                    {
                        wc.comLines++;
                    }
                }
                //-----------------------------------------------------------------
                line = br.readLine(); // 读取下一行数据

            }
            br.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return wc;
    }
}
